package com.zzq.my.jetpacks.jectpackapp.view

import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.viewpager.widget.ViewPager

/**
 * 描述：ViewPager已经默认给我们处理了滑动冲突，而它作为ViewGroup使用的是外部拦截法解决的冲突，
 * 即在onInterceptTouchEvent方法中进行判断的。为了造成滑动冲突场景，那么我们自定义一个ViewPager，
 * 重写onInterceptTouchEvent方法并默认返回false
 *
 * View 的onTouchEvent 方法默认都会消费掉事件（返回true），除非它是不可点击的（clickable和longClickable同时为false），View的longClickable默认为false，clickable需要区分情况，如Button的clickable默认为true，而TextView的clickable默认为false。

所以TextView默认并没有消费事件，因为他是不可点击的。事件会交由父View即BadViewPager的onTouchEvent方法去处理。所以它自然是可以滑动的。

我们将textview的Clickable设置成true，即让它来消费事件

 * 作者：zhuangzeqin
 * 时间: 2022/11/9-15:33
 * 邮箱：zzq@eeepay.cn
 * 备注:
 */
class BadViewPager(ctx:Context,attr: AttributeSet):ViewPager(ctx,attr) {
    //即父View根据需要对事件进行拦截。逻辑处理放在父View的onInterceptTouchEvent方法中。我们只需要重写父View的onInterceptTouchEvent方法，并根据逻辑需要做相应的拦截即可。

    private var mLastXIntercept = 0
    private var mLastYIntercept = 0
    //外部方法
//    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
//        var intercepted = false
//        val x = ev!!.x.toInt()
//        val y = ev!!.y.toInt()
//        val action = ev!!.action and MotionEvent.ACTION_MASK
//        when (action) {
//            MotionEvent.ACTION_DOWN -> {
//                intercepted = false
//                //调用ViewPager的onInterceptTouchEvent方法初始化mActivePointerId
//                //主要是为了初始化ViewPager的成员变量mActivePointerId。mActivePointerId默认值为-1
//                //假如mActivePointerId不进行初始化，ViewPager会认为这个事件已经被子View给消费了，然后break掉，接下来的滑动操作也就不执行了。
//                super.onInterceptTouchEvent(ev)
//            }
//            MotionEvent.ACTION_MOVE -> {
//                //横坐标位移增量
//                val deltaX = x - mLastXIntercept
//                //纵坐标位移增量
//                val deltaY = y - mLastYIntercept
//                //处理逻辑在ACTION_MOVE中，Math.abs(deltaX)>Math.abs(deltaY)表示横向位移增量大于竖向位移增量，即水平滑动，则BadViewPager 拦截事件。
//                intercepted = if (Math.abs(deltaX) > Math.abs(deltaY)) {
//                    true
//                } else {
//                    false
//                }
//            }
//            MotionEvent.ACTION_UP -> intercepted = false
//            else -> {}
//        }
//
//        mLastXIntercept = x;
//        mLastYIntercept = y;
//
//        return intercepted;
//    }

    //外部方法
//    如果父容器需要拦截这个触摸事件则返回true,如果不拦截则返回false;
    override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
        val action = ev.action and MotionEvent.ACTION_MASK
        if (action == MotionEvent.ACTION_DOWN) {
            super.onInterceptTouchEvent(ev)
            return false
        }
        return true
    }
}